package cn.itsource.recursion;

/**
 *	递归：
 *		1. 概念：是一种思想。在方法内部调用自己的方法。（自己干自己）
 *		2. 作用：就是简化逻辑（循环）代码。
 *		3. 核心规律：
 *				1. 通过数值带入的方式，查找逻辑规律：
 *						就是有相似运算逻辑的代码
 *				2. 通过条件判断（条件/循环）的方式，在满足条件的时候根据规律调用自己的方法。如果不满足就不会自己的方法，这就是出口
 *	
 *		4. 注意事项：
 *			1. 递归必须 有出口
 *			2. 能用循环用循环，不要用递归，因为效率极其低下。
 *			为什么效率低下？
 *				方法的调用都是创建新栈帧，入栈，而栈层级是有限制的
 *			StackOverflowError : 栈内存溢出错误。
 *
 *		5. 使用场景：
 *			1. 树状结构数据或者菜单结构的数据查询
 *			2. 有相似逻辑运算的结构
 *			3. 适用于层级结构少，数据量小的场景。（最重要）如果层级多，且数据量大用循环。
 */
public class RecursionTest {

	public static void main(String[] args) {
//		printNum(100000);
		
		printNum2(100000);
	}
	
	/**
	 * 请打印1~n的所有数字
	 * @param n
	 */
	public static void printNum(int n) {
		for (int i = 1; i <= n; i++) {
			System.out.println(i);
		}
	}
	
	/**
	 * 用递归
	 * 请打印1~n的所有数字
	 * @param n
	 */
	public static void printNum2(int n) {
		//打印n就是相似的逻辑代码
		System.out.println(n);
		//条件判断，满足条件，就调用自己的方法
		if (n > 1) {
			printNum2(--n);
		}
	}
	
	

}
